package com.cbry.easyddl.main;

import cn.hutool.core.util.StrUtil;
import com.cbry.easyddl.util.JavaToMySQLTypeConverter;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * @Classname BeanGenDDL
 * @Description
 * @Date 2024/4/26 12:01
 * @Created by liaoxg
 */
public class BeanGenDDL extends AnAction {

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
        Project project = e.getProject();
        if (project == null) return;

        PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
        if (!(psiFile instanceof PsiJavaFile)) return;

        PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile;

        String ddl = generateDDL(psiJavaFile);
        if (ddl != null && !ddl.isEmpty()) {
            createSqlFile(project, ddl, "src/main/sql/GeneratedDDL.sql");
            // createSqlFile(project, ddl, "/sql/GeneratedDDL.sql");
        }
    }

    private String generateDDL(PsiJavaFile psiJavaFile) {

        // 这里应该包含解析 Java 类并生成 DDL的逻辑
        // 以下是一个简单的示例，生成一个基本的 CREATE TABLE 语句
        StringBuilder ddl = new StringBuilder("CREATE TABLE " + StrUtil.toUnderlineCase(psiJavaFile.getClasses()[0].getName()) + " (\n");

        // 获取 PsiJavaFile 中的 PsiClass 对象
        PsiClass[] classes = psiJavaFile.getClasses();
        for (PsiClass psiClass : classes) {
            // 遍历类中的所有字段
            PsiField[] fields = psiClass.getFields();
            for (PsiField field : fields) {
                // 获取字段的类型和名称
                String fieldName = field.getName();
                String fieldType = field.getType().getCanonicalText();

                // Messages.showMessageDialog(fieldType, "测试", Messages.getInformationIcon());
                ddl.append("  ").append('`' +field.getName()+ '`').append("  " + JavaToMySQLTypeConverter.convertJavaToMySQLType(fieldType) + ",\n");

                // 如果需要获取字段的初始值，可以使用 field.getInitializer()，但这仅适用于直接赋予了初始值的字段
            }
            ddl.append("  PRIMARY KEY (");
            ddl.append(fields[0].getName()) // 假设第一个字段是主键
                    .append(")\n");
            ddl.append(");");

            return ddl.toString();
        }
        return "";
    }

    private void createSqlFile(Project project, String content, String filePath) {
        // 使用 WriteCommandAction 确保文件创建和写入操作在一个事务中执行
        WriteCommandAction.runWriteCommandAction(project, () -> {
            VirtualFile sqlFile = null , parentDir = null;
            try {
                parentDir = getFullPath(project,filePath); // 确保这是正确的文件路径
                // VirtualFile parentDir = sqlFile;//sqlFile.getParent();
                sqlFile = parentDir.findOrCreateChildData(this, filePath.split("/")[filePath.split("/").length-1]);//parentDir.getName());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            Document document = FileDocumentManager.getInstance().getDocument(sqlFile);
            if (document != null) {
                document.setText(content);
            }
            FileEditorManager.getInstance(project).openFile(sqlFile, true);
        });
    }

    // 走一遍文件存储目录
    private VirtualFile getFullPath(Project project, String path) throws IOException {
        // 这里需要实现获取项目源代码根目录的逻辑
        // 这可能涉及到查找特定的模块或源代码目录
        // 以下代码只是一个示例，具体实现取决于你的项目结构
        VirtualFile baseDir = project.getBaseDir();
        VirtualFile curDir = baseDir;
        // Messages.showMessageDialog("项目路径："+baseDir.getPath(), "测试", Messages.getInformationIcon());
        String[] parts = path.split("/");

        for (int i = 0; i < parts.length - 1; i++) {
            // 跳过空的路径组件
            if (parts[i].isEmpty()) continue;

            // 查找或创建子目录
            VirtualFile childDir = curDir.findChild(parts[i]);
            if (childDir == null || !childDir.exists()) {
                childDir = curDir.createChildDirectory(ApplicationManager.getApplication(), parts[i]);
            }

            // 更新 curDir 为新创建的目录
            curDir = childDir;
        }
        return curDir; // 假设项目根就是源代码根目录
    }
}
